/*
 * @Description: 
 * @Author: Aroma
 * @Date: 2024-09-24 20:12:23
 * @LastEditors: Aroma
 * @LastEditTime: 2024-09-24 20:27:27
 * @别瞎看: 你个无脑牛马
 */
public class Test7_1_2{
    public static void main(String[] args) {
        String s1="helloworld";//s1指向字符串常量池中的"helloworld"字符串。
        String s2="hello";//s2指向字符串常量池中的"hello"字符串。
        String s3="world";//s3指向字符串常量池中的"world"字符串。
        String s4="hello"+"world";//由于Java编译器会优化字符串常量连接，s4实际上在编译时就被优化为"helloworld"，因此s4也指向字符串常量池中的"helloworld"字符串。
        String s5=s2+s3;//这里s2和s3虽然分别指向字符串常量池中的"hello"和"world"，但s2+s3是一个运行时操作，它会在堆上创建一个新的"helloworld"字符串对象，因此s5指向这个新创建的字符串对象.
        String s6=new String("world");//s6通过new关键字显式地在堆上创建了一个新的"world"字符串对象，这个对象不会被放入字符串常量池中。
        String s7="hello"+new String("world");//这里"hello"是字符串常量，但new String("world")在堆上创建了一个新的"world"字符串对象。因此，"hello"+new String("world")也是一个运行时操作，它会在堆上创建一个新的"helloworld"字符串对象，所以s7指向这个新创建的字符串对象。
        System.out.println(s1==s2);//输出false，因为s1和s2指向不同的字符串对象（尽管它们的内容看起来相似，但s1是"helloworld"，而s2是"hello"）。
        System.out.println(s1==s5);//输出false，因为s1指向字符串常量池中的"helloworld"，而s5指向堆上通过s2+s3操作新创建的"helloworld"对象。
        System.out.println(s1==s6);//输出false，因为s1指向字符串常量池中的"helloworld"，而s6通过new关键字在堆上创建了一个新的"world"字符串对象（尽管内容相似，但对象不同，且s6的内容与s1不完全相同，这里只是说明s6与s1不是同一个对象）。
        System.out.println(s1==s7);//输出false，因为s1指向字符串常量池中的"helloworld"，而s7指向堆上通过"hello"+new String("world")操作新创建的"helloworld"对象。
    }
}